Java进阶-ArrayList 集合初始化容量及扩容

  1. 默认初始化容量10(底层先创建了一个长度为0的数组,当添加第一个元素的时候,初始化容量10)

  2. 集合底层是一个 Object[] 数组

  3. 构造方法

    • new ArrayList();
    • new ArrayList(20);
  4. ArrayList 集合的扩容:增长到原容量的 1.5 倍

  5. ArrayList 集合底层是数组,怎么优化

    • 尽可能少的扩容。因为数组扩容效率比较低,建议在使用 ArrayList 集合的时候预估计元素的个数,给定一个初始化容量
  6. 数组优点:

    • 检索效率比较高(每个元素占用空间大小相同,内存地址是连续的,知道首元素内存地址,然后知道下标,通过数学表达式计算出元素的内存地址,所以检索效率最高)
  7. 数组缺点:

    • 随机增删元素效率比较低
    • 数组无法存储大数据量(很难找到一块非常巨大的连续的内存空间)
  8. 向数组末尾添加元素,效率很高,不受影响

  9. 这么多集合,用哪个集合最多?

    • ArrayList 集合,因为往数组末尾添加元素,效率不受影响。另外,我们检索/查找某个元素的操作比较多。
  10. ArrayList 集合是非线程安全的(不是线程安全的集合)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.ArrayList;
import java.util.List;

public class ArrayListTest01 {

public static void main(String[] args) {
// 默认初始化容量是 10
List list1 = new ArrayList();
// size() 方法是获取当前集合中元素的个数,不是获取集合的容量
System.out.println(list1.size()); // 0

// 指定初始化容量
List list2 = new ArrayList();
System.out.println(list2.size()); // 0

list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
list1.add(5);
list1.add(6);
list1.add(7);
list1.add(8);
list1.add(9);
list1.add(10);
System.out.println(list1.size()); // 10

// 再添加一个
list1.add(11);

// 此时 ArrayList 底层扩容,扩容源代码如下:
// int newCapacity = ArraysSupport.newLength(oldCapacity,
// miCapacity - oldCapacity, /* minimum growth */
// oldCapacity >> 1 /* preferred growth */);

// 二进制转换成10进制:00000100[4] 右移一位 00000010[2] [4/2]
// 原先是4,现在增长2,增长后为6,增长之后的容量是之前容量的1.5倍
}
}